Fix bug #20335 - memory leak when move-constructing a string with unequal allocator. Thanks to Thomas Koeppe for the report git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@213269 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/string b/include/string index d07ff28..d6c148a 100644 --- a/include/string +++ b/include/string 
@@ -1031,16 +1031,16 @@  _CharT __c, _SizeT __pos) _NOEXCEPT  {  if (__sz < 1) -	return __npos; -	if (__pos < __sz) -	++__pos; -	else -	__pos = __sz; -	for (const _CharT* __ps = __p + __pos; __ps != __p;) -	{ -	if (_Traits::eq(*--__ps, __c)) -	return static_cast<_SizeT>(__ps - __p); -	} + return __npos; + if (__pos < __sz) + ++__pos; + else + __pos = __sz; + for (const _CharT* __ps = __p + __pos; __ps != __p;) + { + if (_Traits::eq(*--__ps, __c)) + return static_cast<_SizeT>(__ps - __p); + }  return __npos;  }   @@ -2136,11 +2136,13 @@  basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)  : __r_(__a)  { - if (__a == __str.__alloc() || !__str.__is_long()) - __r_.first().__r = __str.__r_.first().__r; - else + if (__str.__is_long() && __a != __str.__alloc()) // copy, not move  __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size()); - __str.__zero(); + else + { + __r_.first().__r = __str.__r_.first().__r; + __str.__zero(); + }  #if _LIBCPP_DEBUG_LEVEL >= 2  __get_db()->__insert_c(this);  if (__is_long())